﻿using System;
using FTools.Dominio;
using System.Data;
using System.Data.SqlClient;
using FTools.Generico;
using System.Collections;

namespace FTools.Persistencia
{
    class PerProducto
    {
        static string msg = "";

        //OBTENER PRODUCTO
        public Producto obtenerProducto(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdProducto)
        {
            Producto objProducto = new Producto();
            DataTable dataTable = new DataTable();
            try
            {
                SqlCommand command = new SqlCommand("select * from PRODUCTO where ID_PRODUCTO=@IdProducto");

                command.Parameters.AddWithValue("@IdProducto", xIdProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];

                    objProducto.IdProducto = (long)fila.ItemArray[0];
                    objProducto.Codigo = (String)fila.ItemArray[1]; objProducto.Codigo = objProducto.Codigo.Trim();
                    objProducto.Nombre = (String)fila.ItemArray[2]; objProducto.Nombre = objProducto.Nombre.Trim();
                    objProducto.Descripcion = (String)fila.ItemArray[3]; objProducto.Nombre = objProducto.Nombre.Trim();
                    objProducto.Tipo = (String)fila.ItemArray[4]; objProducto.Nombre = objProducto.Nombre.Trim();


                }
                return objProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //EXISTE PRODUCTO
        public Boolean existeProducto(SqlConnection xConexion, SqlTransaction xTransaccion, long xIdProducto)
        {
            DataTable dataTable = new DataTable();

            try
            {
                SqlCommand command = new SqlCommand("select count(*) as EXISTE from PRODUCTO where ID_PRODUCTO=@IdProducto");

                command.Parameters.AddWithValue("@IdProducto", xIdProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    if ((int)fila.ItemArray[0] > 0)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //EXISTE PRODUCTO
        public Boolean existeProducto(SqlConnection xConexion, SqlTransaction xTransaccion, String xCodigo, String xNombre)
        {
            DataTable dataTable = new DataTable();

            try
            {
                SqlCommand command = new SqlCommand("select count(*) as EXISTE from PRODUCTO where CODIGO=@Codigo and NOMBRE=@Nombre");

                command.Parameters.AddWithValue("@Nombre", xNombre.Trim());
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                if (dataTable.Rows.Count >= 0)
                {
                    DataRow fila = dataTable.Rows[0];
                    if ((int)fila.ItemArray[0] > 0)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //OBTENER COLECCION PRODUCTO
        public ArrayList obtenerColeccionProducto(SqlConnection xConexion, SqlTransaction xTransaccion)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colProducto = new ArrayList();

            try
            {
                SqlCommand command = new SqlCommand("select * from PRODUCTO");

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    Producto objProducto = new Producto();
                    DataRow fila = dataTable.Rows[i];
                    objProducto.IdProducto = (long)fila.ItemArray[0];
                    objProducto.Codigo = (String)fila.ItemArray[1]; objProducto.Codigo = objProducto.Codigo.Trim();
                    objProducto.Nombre = (String)fila.ItemArray[2]; objProducto.Nombre = objProducto.Nombre.Trim();
                    objProducto.Descripcion = (String)fila.ItemArray[3]; objProducto.Descripcion = objProducto.Descripcion.Trim();
                    objProducto.Tipo = (String)fila.ItemArray[4]; objProducto.Tipo = objProducto.Tipo.Trim();
                    colProducto.Add(objProducto);
                }
                return colProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //BUSQUEDA PRODUCTO (Codigo y Nombre simult)
        public ArrayList obtenerBusquedaProductoSimult(SqlConnection xConexion, SqlTransaction xTransaccion, String xCodigo, String xNombre)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colProducto = new ArrayList();

            try
            {
                SqlCommand command = new SqlCommand("select * from PRODUCTO where " +
                                             "(CODIGO like @Codigo + '%') or " +
                                             "(NOMBRE like @Nombre + '%')");

                command.Parameters.AddWithValue("@Codigo", xCodigo.Trim());
                command.Parameters.AddWithValue("@Nombre", xNombre.Trim());
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    Producto objProducto = new Producto();
                    DataRow fila = dataTable.Rows[i];
                    objProducto.IdProducto = (long)fila.ItemArray[0];
                    objProducto.Codigo = (String)fila.ItemArray[1]; objProducto.Codigo = objProducto.Codigo.Trim();
                    objProducto.Nombre = (String)fila.ItemArray[2]; objProducto.Nombre = objProducto.Nombre.Trim();
                    objProducto.Descripcion = (String)fila.ItemArray[3]; objProducto.Descripcion = objProducto.Descripcion.Trim();
                    objProducto.Tipo = (String)fila.ItemArray[4]; objProducto.Tipo = objProducto.Tipo.Trim();
                    colProducto.Add(objProducto);
                }
                return colProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //BUSQUEDA PRODUCTO
        public ArrayList obtenerBusquedaProducto(SqlConnection xConexion, SqlTransaction xTransaccion, String xCodigo, String xNombre, String xDescripcion)
        {
            SqlDataAdapter dataAdapter;
            DataTable dataTable = new DataTable();
            ArrayList colProducto = new ArrayList();

            try
            {
                SqlCommand command = new SqlCommand("select * from PRODUCTO where " +
                                                    "(CODIGO like @Codigo + '%' or @Codigo = '') and " +
                                                    "(NOMBRE like @Nombre + '%' or @Codigo = '') and " + 
                                                    "(DESCRIPCION like @Descripcion + '%' or @Descripcion = '')");

                command.Parameters.AddWithValue("@Codigo", xCodigo.Trim());
                command.Parameters.AddWithValue("@Nombre", xNombre.Trim());
                command.Parameters.AddWithValue("@Descripcion", xDescripcion.Trim());
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                dataAdapter = new SqlDataAdapter(command);
                dataAdapter.Fill(dataTable);
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    Producto objProducto = new Producto();
                    DataRow fila = dataTable.Rows[i];
                    objProducto.IdProducto = (long)fila.ItemArray[0];
                    objProducto.Codigo = (String)fila.ItemArray[1]; objProducto.Codigo = objProducto.Codigo.Trim();
                    objProducto.Nombre = (String)fila.ItemArray[2]; objProducto.Nombre = objProducto.Nombre.Trim();
                    objProducto.Descripcion = (String)fila.ItemArray[3]; objProducto.Descripcion = objProducto.Descripcion.Trim();
                    objProducto.Tipo = (String)fila.ItemArray[4]; objProducto.Tipo = objProducto.Tipo.Trim();
                    colProducto.Add(objProducto);
                }
                return colProducto;
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //ALTA PRODUCTO
        public int altaProducto(SqlConnection xConexion, SqlTransaction xTransaccion, Producto xObjProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("insert into PRODUCTO values (@IdProducto, @Codigo, @Nombre, @Descripcion, @Tipo)");

                command.Parameters.AddWithValue("@IdProducto", xObjProducto.IdProducto);
                command.Parameters.AddWithValue("@Codigo", xObjProducto.Codigo.Trim());
                command.Parameters.AddWithValue("@Nombre", xObjProducto.Nombre.Trim());
                command.Parameters.AddWithValue("@Descripcion", xObjProducto.Descripcion.Trim());
                command.Parameters.AddWithValue("@Tipo", xObjProducto.Tipo.Trim());

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //BAJA PRODUCTO
        public int bajaProducto(SqlConnection xConexion, SqlTransaction xTransaccion, Producto xObjProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("delete from PRODUCTO where ID_PRODUCTO=@IdProducto");

                command.Parameters.AddWithValue("@IdProducto", xObjProducto.IdProducto);
                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }

        //MODIFICA PRODUCTO
        public int modificaProducto(SqlConnection xConexion, SqlTransaction xTransaccion, Producto xObjProducto)
        {
            try
            {
                SqlCommand command = new SqlCommand("update PRODUCTO set CODIGO=@Codigo, NOMBRE=@Nombre, DESCRIPCION=@Descripcion, TIPO=@Tipo " +
                                                    "where ID_PRODUCTO = @IdProducto");

                command.Parameters.AddWithValue("@IdProducto", xObjProducto.IdProducto);
                command.Parameters.AddWithValue("@Codigo", xObjProducto.Codigo.Trim());
                command.Parameters.AddWithValue("@Nombre", xObjProducto.Nombre.Trim());
                command.Parameters.AddWithValue("@Descripcion", xObjProducto.Descripcion.Trim());
                command.Parameters.AddWithValue("@Tipo", xObjProducto.Tipo.Trim());

                command.Connection = xConexion;
                command.Transaction = xTransaccion;
                return command.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                for (int i = 0; i < ex.Errors.Count; i++)
                {
                    msg += "Error #" + i + " Message: " + ex.Errors[i].Message + "\n";
                }
                System.Console.WriteLine(msg);
                throw new Exception("#Persistencia# " + ex.Message);
            }
        }
    }
}
